//package ai.esc.speedy.admin.user.interfaces.controller.oauth2.server;
//
//import ai.esc.speedy.admin.user.infrastructure.oauth2.AuthorizeService;
//import ai.esc.speedy.admin.user.infrastructure.oauth2.ClientService;
//import ai.esc.speedy.admin.user.infrastructure.oauth2.ResponseType;
//import org.apache.oltu.oauth2.as.issuer.MD5Generator;
//import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
//import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
//import org.apache.oltu.oauth2.as.response.OAuthASResponse;
//import org.apache.oltu.oauth2.common.OAuth;
//import org.apache.oltu.oauth2.common.error.OAuthError;
//import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
//import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
//import org.apache.oltu.oauth2.common.message.OAuthResponse;
//import org.apache.oltu.oauth2.common.utils.OAuthUtils;
//import org.apache.shiro.SecurityUtils;
//import org.apache.shiro.authc.IncorrectCredentialsException;
//import org.apache.shiro.authc.LockedAccountException;
//import org.apache.shiro.authc.UnknownAccountException;
//import org.apache.shiro.authc.UsernamePasswordToken;
//import org.apache.shiro.subject.Subject;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.ui.Model;
//import org.springframework.util.StringUtils;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.net.URI;
//import java.net.URISyntaxException;
//
///**
// * AS
// *
// * @author Rubin
// * @version v1 2020/2/28 11:02
// */
//@RestController
//@RequestMapping("/oauth-server")
//public class AuthorizeController {
//
//    @Autowired
//    private AuthorizeService authorizeService;
//
//    @Autowired
//    private ClientService clientService;
//
//    @RequestMapping("/authorize")
//    public Object authorize(Model model, HttpServletRequest request) {
//
//
//        try {
//            //构建OAuth 授权请求
//            OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request);
//
//            //根据传入的clientId 判断 客户端是否存在
//            if (!authorizeService.checkClientId(oauthRequest.getClientId())) {
//                //生成错误信息,告知客户端不存在
//                OAuthResponse response = OAuthASResponse
//                        .errorResponse(HttpServletResponse.SC_BAD_REQUEST)
//                        .setError(OAuthError.TokenResponse.INVALID_CLIENT)
//                        .setErrorDescription("客户端验证失败，如错误的client_id/client_secret")
//                        .buildJSONMessage();
//                return new ResponseEntity(
//                        response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));
//            }
//
//            // 判断用户是否登录
//            Subject subject = SecurityUtils.getSubject();
//            //如果用户没有登录,跳转到登录页面
//            if (!subject.isAuthenticated()) {
//                if (!login(subject, request)) {
//                    //登录失败时跳转到登陆页面
//                    model.addAttribute("client", clientService.findByClientId(oauthRequest.getClientId()));
//                    return "oauth2login";
//                }
//            }
//            String username = (String) subject.getPrincipal();
//
//            //生成授权码
//            String authorizationCode = null;
//
//            String responseType = oauthRequest.getParam(OAuth.OAUTH_RESPONSE_TYPE);
//            if (responseType.equals(ResponseType.CODE.toString())) {
//                OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(new MD5Generator());
//                authorizationCode = oAuthIssuer.authorizationCode();
//                //把授权码放到缓存中
//                authorizeService.addAuthCode(authorizationCode, username);
//            }
//
//            // 进行OAuth响应构建
//            OAuthASResponse.OAuthAuthorizationResponseBuilder builder = OAuthASResponse.authorizationResponse(request, HttpServletResponse.SC_FOUND);
//            // 设置授权码
//            builder.setCode(authorizationCode);
//            // 根据客户端重定向地址
//            String redirectURI = oauthRequest.getParam(OAuth.OAUTH_REDIRECT_URI);
//            // 构建响应
//            final OAuthResponse response = builder.location(redirectURI).buildQueryMessage();
//
//            // 根据OAuthResponse 返回 ResponseEntity响应
//            HttpHeaders headers = new HttpHeaders();
//            try {
//                headers.setLocation(new URI(response.getLocationUri()));
//            } catch (URISyntaxException e) {
//                e.printStackTrace();
//            }
//            return new ResponseEntity(headers, HttpStatus.valueOf(response.getResponseStatus()));
//
//        } catch (OAuthProblemException e1) {
//            // 出错处理
//            ResponseEntity responseEntity = null;
//            String redirectUri = e1.getRedirectUri();
//            if (OAuthUtils.isEmpty(redirectUri)) {
//                // 告诉客户端没有传入redirectUri直接报错
//                return new ResponseEntity("告诉客户端没有传入redirectUri直接报错！", HttpStatus.NOT_FOUND);
//            }
//            // 返回错误消息
//            try {
//                HttpHeaders headers = new HttpHeaders();
//                final OAuthResponse response = OAuthASResponse
//                        .errorResponse(HttpServletResponse.SC_FOUND).error(e1)
//                        .location(redirectUri).buildQueryMessage();
//                headers.setLocation(new URI(response.getLocationUri()));
//                responseEntity = new ResponseEntity(headers, HttpStatus.valueOf(response.getResponseStatus()));
//            } catch (OAuthSystemException | URISyntaxException e) {
//                e.printStackTrace();
//            }
//
//            return responseEntity;
//        } catch (OAuthSystemException e2) {
//            e2.printStackTrace();
//        }
//
//        return null;
//
//    }
//
//    private boolean login(Subject subject, HttpServletRequest request) {
//        if ("get".equalsIgnoreCase(request.getMethod())) {
//            return false;
//        }
//
//        String username = request.getParameter("username");
//        String password = request.getParameter("password");
//
//        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
//            return false;
//        }
//
//        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//
//        try {
//            subject.login(token);
//            return true;
//        } catch (Exception e) {
//
//            if (e instanceof UnknownAccountException) {
//                request.setAttribute("msg", "用户名或密码错误！");
//            }
//
//            if (e instanceof IncorrectCredentialsException) {
//                request.setAttribute("msg", "用户名或密码错误！");
//            }
//
//            if (e instanceof LockedAccountException) {
//                request.setAttribute("msg", "账号已被锁定,请联系管理员！");
//            }
//            return false;
//        }
//    }
//}
